8711
12555
Od jakiegoś czasu bawię się JSON, po prostu wypychając go jako tekst i nikomu to nie zaszkodziło (o czym wiem), ale chciałbym zacząć robić wszystko poprawnie.
Widziałem wiele rzekomych „standardów” dla typu zawartości JSON:
application / json
application / x-javascript
text / javascript
text / x-javascript
text / x-json
Ale który z nich jest poprawny lub najlepszy? Rozumiem, że istnieją różne problemy z bezpieczeństwem i obsługą przeglądarki.
Wiem, że istnieje podobne pytanie, jaki typ MIME, jeśli JSON jest zwracany przez REST API?, Ale chciałbym uzyskać nieco bardziej ukierunkowaną odpowiedź. 
1
2
Kolejny
W przypadku tekstu JSON:
application / json
Typ nośnika MIME dla tekstu JSON to application / json. Domyślne kodowanie to UTF-8. (Źródło: RFC 4627).
Dla JSONP (uruchamialny JavaScript) z wywołaniem zwrotnym:
application / javascript
Oto kilka postów na blogu, które zostały wymienione w odpowiednich komentarzach:
Dlaczego nie powinieneś używać text / html dla JSON
Internet Explorer czasami ma problemy z aplikacją / json
Dość pełna lista typów MIME i do czego ich używać
Oficjalna lista typów mime w IANA z odpowiedzi @ gnrfan poniżej
|
IANA zarejestrowała oficjalny typ MIME dla JSON jako application / json.
Zapytany o to, dlaczego nie text / json, Crockford wydaje się, że powiedział, że JSON nie jest tak naprawdę JavaScript ani tekstem, a także IANA częściej rozdaje application / * niż text / *.
Więcej zasobów:
Typy mediów
Prośba o komentarze 46 27
bluesmoon: JSON ma typ
|
W przypadku JSON:
Content-Type: application / json
W przypadku JSON-P:
Content-Type: application / javascript
|
Oczywiście prawidłowym typem nośnika MIME dla JSON jest application / json, ale konieczne jest uświadomienie sobie, jakiego typu danych oczekuje się w aplikacji.
Na przykład używam Ext GWT, a odpowiedź serwera musi mieć postać text / html, ale zawiera dane JSON.
Po stronie klienta, odbiornik formularzy Ext GWT
uploadForm.getForm (). addListener (nowy FormListenerAdapter ()
{
@Nadpisanie
public void onActionFailed (formularz, int httpStatus, String responseText)
{
MessageBox.alert ("Błąd");
}
@Nadpisanie
public void onActionComplete (formularz, int httpStatus, String responseText)
{
MessageBox.alert ("Sukces");
}
});
W przypadku korzystania z typu odpowiedzi application / json, przeglądarka sugeruje mi zapisanie pliku.
Fragment kodu źródłowego po stronie serwera przy użyciu Spring MVC
zwraca nowe AbstractUrlBasedView ()
{
@SuppressWarnings („niezaznaczone”)
@Nadpisanie
protected void renderMergedOutputModel (model mapy, żądanie HttpServletRequest,
HttpServletResponse) zgłasza wyjątek
{
response.setContentType ("text / html");
response.getWriter (). write (json);
}
};
|
JSON:
Odpowiedź to dane generowane dynamicznie, zgodnie z parametrami zapytania przekazanymi w adresie URL.
Przykład:
{"Name": "Foo", "Id": 1234, "Rank": 7}
Content-Type: application / json
JSON-P:
JSON z dopełnieniem.
Odpowiedź to dane JSON z zawiniętym wywołaniem funkcji.
Przykład:
functionCall ({"Name": "Foo", "Id": 1234, "Rank": 7});
Content-Type: application / javascript
|
Jeśli używasz Ubuntu lub Debian i udostępniasz pliki .json za pośrednictwem Apache, możesz chcieć udostępniać pliki z odpowiednim typem zawartości. Robię to głównie dlatego, że chcę używać rozszerzenia JSONView do przeglądarki Firefox
Moduł mod_mime Apache pomoże to łatwo zrobić. Jednak w Ubuntu musisz edytować plik /etc/mime.types i dodać linię
application / json json
Następnie uruchom ponownie Apache:
restart usługi sudo apache2
|
Jeśli wywołujesz usługi sieci Web ASP.NET po stronie klienta, musisz użyć application / json, aby działało. Uważam, że to samo dotyczy frameworków jQuery i Ext.
|
Właściwy typ zawartości dla JSON to application / json, chyba że używasz JSONP, znanego również jako JSON z dopełnieniem, który jest w rzeczywistości JavaScript, więc odpowiednim typem zawartości będzie application / javascript.
|
Nie ma wątpliwości, że application / json jest najlepszym typem MIME dla odpowiedzi JSON.
Ale miałem pewne doświadczenie, w którym musiałem używać application / x-javascript z powodu problemów z kompresją. Moje środowisko hostingowe to hosting współdzielony z GoDaddy. Nie pozwalają mi na zmianę konfiguracji serwera. Dodałem następujący kod do mojego pliku web.config w celu skompresowania odpowiedzi.
















Korzystając z tego, strony .aspx zostały skompresowane za pomocą g-zip, ale odpowiedzi JSON nie. dodałem

w sekcjach typów statycznych i dynamicznych. Ale to w ogóle nie kompresuje odpowiedzi JSON.
Następnie usunąłem ten nowo dodany typ i dodałem

w sekcjach typów statycznych i dynamicznych i zmienił typ odpowiedzi w
.ashx (program obsługi asynchronicznej) do
application / x-javascript
A teraz odkryłem, że moje odpowiedzi JSON zostały skompresowane za pomocą g-zip. Więc osobiście polecam używać
application / x-javascript
tylko wtedy, gdy chcesz skompresować odpowiedzi JSON we współdzielonym środowisku hostingu. Ponieważ w hostingu współdzielonym nie pozwalają one na zmianę usług IISkonfiguracje.
|
Tylko w przypadku używania application / json jako typu MIME (stan na listopad 2011 z najnowszymi wersjami przeglądarki Chrome, Firefox z Firebug):
Koniec z ostrzeżeniami z Chrome, gdy JSON jest ładowany z serwera.
Firebug doda kartę do odpowiedzi pokazującą dane JSON
sformatowany. Jeśli typ MIME jest inny, pojawi się po prostu jako
„Treść odpowiedzi”.
|
Nie wszystko działa dla aplikacji typu content / json.
Jeśli używasz przesyłania formularza Ext JS do przesłania pliku, pamiętaj, że odpowiedź serwera jest analizowana przez przeglądarkę w celu utworzenia dokumentu dla elementu